struct SUI64
{
	//Data
	unsigned int m_uiLeft;
	unsigned int m_uiRight;

	//Operators
	SUI64& operator++()
	{
		unsigned int uiTemp = m_uiRight;
		m_uiRight++;
		if(m_uiRight < uiTemp)
			m_uiLeft++;
		return *this;
	}

	SUI64& operator--()
	{
		unsigned int uiTemp = m_uiRight;
		m_uiRight--;
		if(m_uiRight > uiTemp)
			m_uiLeft--;
		return *this;
	}

	SUI64& operator+=(SUI64 const& roUI64)
	{
		m_uiRight += roUI64.m_uiRight;
		if(m_uiRight < roUI64.m_uiRight)
			m_uiLeft++;
		m_uiLeft += roUI64.m_uiLeft;
		return *this;
	}

	SUI64& operator|=(SUI64 const& roUI64)
	{
		m_uiRight |= roUI64.m_uiRight;
		m_uiLeft |= roUI64.m_uiLeft;
		return *this;
	}

	SUI64& operator&=(SUI64 const& roUI64)
	{
		m_uiRight &= roUI64.m_uiRight;
		m_uiLeft &= roUI64.m_uiLeft;
		return *this;
	}

	SUI64& operator^=(SUI64 const& roUI64)
	{
		m_uiRight ^= roUI64.m_uiRight;
		m_uiLeft ^= roUI64.m_uiLeft;
		return *this;
	}

	SUI64& operator<<=(unsigned int uiBits)
	{
		if(uiBits < 32)
		{
			(m_uiLeft <<= uiBits) |= (m_uiRight >> (32-uiBits));
			m_uiRight <<= uiBits;
			
		}
		else
		{
			m_uiLeft = m_uiRight << (uiBits-32);
			m_uiRight = 0;
		}
		return *this;
	}

	SUI64& operator>>=(unsigned int uiBits)
	{
		if(uiBits < 32)
		{
			(m_uiRight >>= uiBits) |= (m_uiLeft << (32-uiBits));
			m_uiLeft >>= uiBits;
		}
		else
		{
			m_uiRight = m_uiLeft >> (uiBits-32);
			m_uiLeft = 0;
		}
		return *this;
	}

	bool operator>(SUI64 const& roUI64) const
	{
		if(m_uiLeft == roUI64.m_uiLeft)
			return m_uiRight > roUI64.m_uiRight;
		else
			return m_uiLeft > roUI64.m_uiLeft;
	}

	bool operator<(SUI64 const& roUI64) const
	{
		if(m_uiLeft == roUI64.m_uiLeft)
			return m_uiRight < roUI64.m_uiRight;
		else
			return m_uiLeft < roUI64.m_uiLeft;
	}
};

inline SUI64 operator+(SUI64 const& roUI64_1, SUI64 const& roUI64_2)
{
	SUI64 temp = roUI64_1;
	temp += roUI64_2;
	return temp;
}

inline SUI64 operator|(SUI64 const& roUI64_1, SUI64 const& roUI64_2)
{
	SUI64 temp = roUI64_1;
	temp |= roUI64_2;
	return temp;
}

inline SUI64 operator&(SUI64 const& roUI64_1, SUI64 const& roUI64_2)
{
	SUI64 temp = roUI64_1;
	temp &= roUI64_2;
	return temp;
}

inline SUI64 operator^(SUI64 const& roUI64_1, SUI64 const& roUI64_2)
{
	SUI64 temp = roUI64_1;
	temp ^= roUI64_2;
	return temp;
}

inline SUI64 operator<<(SUI64 const& roUI64, unsigned int uiBits)
{
	SUI64 temp = roUI64;
	temp <<= uiBits;
	return temp;
}

inline SUI64 operator>>(SUI64 const& roUI64, unsigned int uiBits)
{
	SUI64 temp = roUI64;
	temp >>= uiBits;
	return temp;
}

inline bool operator>(SUI64 const& roUI64_1, SUI64 const& roUI64_2)
{
	return roUI64_1.operator>(roUI64_2);
}

inline bool operator<(SUI64 const& roUI64_1, SUI64 const& roUI64_2)
{
	return roUI64_1.operator<(roUI64_2);
}